// node 里面的path 识别对象
import path from 'path'

/**
 * @msg: 获取所有子集路由
 * @param {*}
 * @return {*}
 */
const getChildrenRoutes = (routes) => {
  const result = []
  routes.forEach((route) => {
    if (route.children && route.children.length > 0) {
      result.push(...route.children)
    }
  })
  return result
}

/**
 * @msg: 处理脱离层级的路由
 * @msg: 处理脱离层级的路由：某个一级路由为其他子路由，则剔除该一级路由，保留路由层级
 * @param {*}
 * @return {*}
 */
export const filterRouters = (routes) => {
  // 所有的子集路由
  const childrenRoutes = getChildrenRoutes(routes)
  // 根据子集路由进行查重操作
  return routes.filter((route) => {
    // 根据 route 在 childrenRoutes 中进行查重，把所有重复的路由表 剔除
    return !childrenRoutes.find((childrenRoute) => {
      return route.path === childrenRoute.path
    })
  })
}

const isNull = (data) => {
  if (!data) return true
  if (JSON.stringify(data) === '{}') return true
  if (JSON.stringify(data) === '[]') return true
  return false
}

/**
 * @msg: 根据 routes(filterRouters) 数据，返回对应的 menu 规则数据
 * @param {*}
 * @return {*}
 */
export const generateMenus = (routes, basePath = '') => {
  const result = []
  // 不满足该条件 `meta && meta.title && meta.icon` 的数据不该存在
  routes.forEach((item) => {
    // 不存在 children && 不存在 meta 直接 return 剔除/login /404
    if (isNull(item.meta) && isNull(item.children)) return
    // 存在 children 不存在 meta，进入迭代
    if (isNull(item.meta) && !isNull(item.children)) {
      result.push(...generateMenus(item.children))
      return
    }
    // 不存在 children，存在 meta || 存在 children && 存在 meta
    // 因为最终的 menu 需要进行跳转，此时我们需要合并 path
    const routePath = path.resolve(basePath, item.path)
    // 路由分离之后，存在同名父路由的情况，需要单独处理
    let route = result.find((item) => item.path === routePath)
    // 当前路由尚未加入到 result
    if (!route) {
      route = {
        ...item,
        path: routePath,
        children: []
      }
      // icon 与 title 必须全部存在
      if (route.meta.icon && route.meta.title) {
        // meta 存在生成 route 对象，放入 arr
        result.push(route)
      }
    }
    // 存在 children && 存在 meta
    if (item.children) {
      route.children.push(...generateMenus(item.children, route.path))
    }
  })
  return result
}
